﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web.Mvc;
using SIBI.Models;
using PagedList;
using System.Net.Mail;
using System.IO;
using System.Net.Mime;

namespace SIBI.Controllers
{
    [Authorize]
    public class MantenimientoController : Controller
    {
        private SIBIContext db = new SIBIContext();

        private TEJECUTIVOContext db1 = new TEJECUTIVOContext();

        //***********************************************************************************//
        // Autor:  										                    				*//
		//***********************************************************************************//
		// Index()													 						*//
		// Función que devuelve la vista de todos los ítems de Mantenimiento listados en la *//
		// pantalla.																		*//
		// _________________________________________________________________________________*//
		// Entrada: None                                        							*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los Mantenimiento listados.						*//
		// _________________________________________________________________________________*//
        public ViewResult Index()
        {
            var mantenimientoes = db.Mantenimientoes.Include(m => m.npro).Include(m => m.nbin);
            return View(mantenimientoes.ToList());
        }

		//***********************************************************************************//
        // Autor:  							                			     				*//
		//***********************************************************************************//
		// SearchIndex()	Acceso INVITADO	y ADMINISTRADOR									*//
		// Acción que devuelve la vista de todos los ítems de Mantenimiento listados, 		*//
		// paginados y con opción de búsqueda.		 										*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
		// 		búsqueda, por defecto es 1.													*//
		// •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
		// 		búsqueda. 																	*//
		// •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
		// 		filtrado para mantenerla durante los cambios de página. 					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los Mantenimiento listados deseados.				*//
		// _________________________________________________________________________________*//
        public ActionResult SearchIndex(string currentSerial, 
                        string searchSerial, DateTime? currentFechaIni, 
                        DateTime? searchFechaIni, DateTime? currentFechaFinal, 
                        DateTime? searchFechaFinal, int? page = 1)
        {
		
           var man= db.Mantenimientoes.Include(m => m.npro).Include(m => m.nbin);

		   //Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchFechaIni = currentFechaIni;
                searchFechaFinal = currentFechaFinal;
            }
            else
            {
                page = 1;
            }
			
			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentFechaIni = searchFechaIni;
            ViewBag.CurrentFechaFinal = searchFechaFinal;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

			//Filtrado por los parametros en entreda capturado en al interfaz
            if (!String.IsNullOrEmpty(searchSerial))
            {
                //  ----------------- Buscar BienInformatico----------------\\

                var bieninformatico = from m in db.BienInformaticoes
                             where m.BienInformaticoId.Contains(searchSerial)
                             select m.BienInformaticoId;

                man = man.Where(s => bieninformatico.Contains(s.BienInformaticoId));
            }

            if (!String.IsNullOrEmpty(searchFechaIni.ToString()))
            {
                man = man.Where(s => s.dfim == searchFechaIni);
            }

            if (!String.IsNullOrEmpty(searchFechaFinal.ToString()))
            {
                man = man.Where(s => s.dffm == searchFechaFinal);
            }

			//Ordenar los BI del return
            man = man.OrderByDescending(x => x.dfim);
			
            return View(man.ToPagedList(pageIndex, pageSize));
        }

		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// SearchAsignarMantenimiento()	Acceso solo ADMINISTRADOR							*//
		// Acción que devuelve la vista de todos los ítems de BI que pueden ser asignados a *//
		// mantenimiento, de manera listada, paginada y con opción a búsqueda				*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
		//		notificación de movimiento o  no.											*//
		// •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
		// 		búsqueda, por defecto es 1.													*//
		// •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
		// 		búsqueda. 																	*//
		// •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
		// 		filtrado para mantenerla durante los cambios de página. 					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los BI posibles a asignar a mantenimiento.		*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult SearchAsignarMantenimiento(string msnCorreo, 
            string currentSerial, string searchSerial, 
            string currentEst, string searchEst, 
            string currentTipo, string searchTipo, 
            string currentUbi, string searchClaseObjeto, 
            string currentAct, string searchAct, 
            string currentRes, string searchRes, int? page = 1)
        {
            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchClaseObjeto = currentUbi;
                searchEst = currentEst;
                searchTipo = currentTipo;

                searchAct = currentAct;
                searchRes = currentRes;
            }
            else
            {
                page = 1;
            }
			
			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentUbi = searchClaseObjeto;
            ViewBag.CurrentEst = searchEst;
            ViewBag.CurrentTipo = searchTipo;
            ViewBag.msnCorreo = msnCorreo;

            ViewBag.CurrentAct = searchAct;
            ViewBag.CurrentRes = searchRes;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

			//Filtrado por los parametros en entreda capturado en al interfaz
            if (!String.IsNullOrEmpty(searchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(searchSerial));
            }

            if (!String.IsNullOrEmpty(searchClaseObjeto))
            {
                bi = bi.Where(s => s.nmym.ncob.cnom.Contains(searchClaseObjeto));
            }

            if (!String.IsNullOrEmpty(searchEst))
            {
                bi = bi.Where(s => s.nest.cnom.Contains(searchEst));
            }

            if (!String.IsNullOrEmpty(searchTipo))
            {
                bi = bi.Where(s => s.ntib.cnom.Contains(searchTipo));
            }

            if (!String.IsNullOrEmpty(searchAct))
            {
                bi = bi.Where(s => s.nanf.Contains(searchAct));
            }

            if (!String.IsNullOrEmpty(searchRes))
            {
                bi = bi.Where(s => s.ncar.empleados.Contains(searchRes));
            }
			
			//Ordenar los BI del return
            bi = bi.OrderBy(x => x.BienInformaticoId);
            List<BienInformatico> lbi;
            if (bi.Count() > 10)
                if (bi.Count() - (pageIndex * pageSize) < 11)
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count() - (pageIndex * pageSize));
                else
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, pageSize);
            else
                lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count());
            List<string> localidades = new List<string>();
            var i = 1;
            foreach (var bbii in lbi)
            {
                if (i > pageSize) break;
                if (bbii.ncar == null)
                {
                    try
                    {
                        localidades.Add(
                                        (from loc in db1.LOCALIDAD
                                         where loc.localidad_id == bbii.localidad_id
                                         select loc.localidad_nombre).First().ToString()
                                       );
                    }
                    catch
                    {
                        localidades.Add("");
                    }
                }
                else
                {
                    localidades.Add("");
                }
                i = i + 1;
            }

            ViewBag.Localidades = localidades;
            return View(bi.ToPagedList(pageIndex, pageSize));
        }

		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// ManteDarAlta()	Acceso solo ADMINISTRADOR										*//
		// Acción que devuelve la vista de todos los ítems de BI que pueden ser retirados de*//
		// mantenimiento, de manera listada, paginada y con opción a búsqueda		 		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
		//		notificación de movimiento o  no.											*//
		// •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
		// 		búsqueda, por defecto es 1.													*//
		// •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
		// 		búsqueda. 																	*//
		// •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
		// 		filtrado para mantenerla durante los cambios de página. 					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los BI que pueden salir de Mantenimiento			*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult ManteDarAlta(string currentSerial, 
                            string searchSerial, DateTime? currentFechaIni, 
                            DateTime? searchFechaIni, DateTime? currentFechaFinal, 
                            DateTime? searchFechaFinal, int? page = 1)
        {

            var man = db.Mantenimientoes.Include(m => m.npro).Include(m => m.nbin);

			//Metodo GET Inicializar las variables con los valores de busqueda introducidos
            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchFechaIni = currentFechaIni;
                searchFechaFinal = currentFechaFinal;
            }
            else
            {
                page = 1;
            }
			
			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentFechaIni = searchFechaIni;
            ViewBag.CurrentFechaFinal = searchFechaFinal;


            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            //Filtrado de lista de Bienes Informáticos, solo Matenimiento
            man = man.Where(s => s.dffm == null);

			//Filtrado por los parametros en entreda capturado en al interfaz
            if (!String.IsNullOrEmpty(searchSerial))
            {

                var bieninformatico = from m in db.BienInformaticoes
                                      where m.BienInformaticoId.Contains(searchSerial)
                                      select m.BienInformaticoId;

                man = man.Where(s => bieninformatico.Contains(s.BienInformaticoId));
            }

            if (!String.IsNullOrEmpty(searchFechaIni.ToString()))
            {
                man = man.Where(s => s.dfim == searchFechaIni);
            }

            if (!String.IsNullOrEmpty(searchFechaFinal.ToString()))
            {
                man = man.Where(s => s.dffm == searchFechaFinal);
            }

			//Ordenar los BI del return
            man = man.OrderBy(x => x.dfim);
			
            return View(man.ToPagedList(pageIndex, pageSize));
        }

       
		//***********************************************************************************//
        // Autor:  							                			     				*//
		//***********************************************************************************//
		// Details()	Acceso INVITADO	y ADMINISTRADOR										*//
		// Función que devuelve la vista de los detalles de un Mantenimiento especificado.	*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del Mantenimiento que se desea ver los detalles. 			*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee todos los datos del Mantenimiento desado.				*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ViewResult Details(int id)
        {
            Mantenimiento mantenimiento = db.Mantenimientoes.Find(id);
            return View(mantenimiento);
        }

		//***********************************************************************************//
        // Autor:  							                			     				*//
		//***********************************************************************************//
		// AsignarMantenimiento()	Acceso solo ADMINISTRADOR								*//
		// Acción que devuelve la vista para asignar un BI a mantenimiento. Método GET.		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del BI que se desea asignar a Mantenimiento.				*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve la plantilla para asignar un BI a mantenimiento.		*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult AsignarMantenimiento(string id)
        {
			//Metodo GET Inicializar las variables con los valores predeterminados
            ViewBag.ProveedorId = "";
            ViewBag.AsignadoA = "";
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", id);
            return View();
        } 

		//***********************************************************************************//
        // Autor:  							                			     				*//
		//***********************************************************************************//
		// AsignarMantenimiento()	Acceso solo ADMINISTRADOR								*//
		// Acción que devuelve la vista para asignar un BI a mantenimiento. Método POST.	*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	mantenimiento: dato de tipo modelo, que representa un mantenimiento, este es*//
		// 		requerido para verificar que los datos suministrados son correctos,  para 	*//
		// 		así asignar o enviar un mensaje de error en la aplicación.					*//
		// •	BienInformaticoId: caracteres que contienen el id del bien informático que 	*//
		//		se envía a mantenimiento. 													*//
		// •	Parametros con sufijo Visible: String utilizado para el manejo del 			*//
		// 		autocompletado de campos. 													*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve el BI asignado a mantenimiento.						*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult AsignarMantenimiento(Mantenimiento mantenimiento, 
                            string BienInformaticoId, string ProveedorId_Visible)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(BienInformaticoId);

            if(bieninformatico!=null){

                var cargoAnteriorId = bieninformatico.CargoId;
                var localidadAnteriorId = bieninformatico.localidad_id;

                bieninformatico.EstadoId = 3;
                bieninformatico.CargoId = "DEPOSITO";

                if (ModelState.IsValid)
                {
                    mantenimiento.dman = DateTime.Now;
                    db.Entry(bieninformatico).State = EntityState.Modified;
                    db.Mantenimientoes.Add(mantenimiento);

                    db.SaveChanges();

                    var cargoN = (from m in db.Cargoes
                                  where m.CargoId == bieninformatico.CargoId
                                  select m).ToList().FirstOrDefault();
                    var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + "."; 

                    // Carga Movimiento
                    creacionMovimiento("Salida", obs, bieninformatico.cubf,
                            bieninformatico.localidad_id, 3,
                                bieninformatico.BienInformaticoId);

                    //--------------------------------  Envio de Correo  ------------------------------//
                    //Obtención del nombre de la Localidad
                    var localidad = (from m in db1.LOCALIDAD
                                     where m.localidad_id == localidadAnteriorId
                                     select m.localidad_nombre).ToList();

                    //Obtención del nombre del cargo
                    var cargo = (from c in db.Cargoes
                                 where c.CargoId == cargoAnteriorId
                                 select c.cdes).ToList();

                    //Obtención de la marca modelo
                    var marcaModelo = (from c in db.MarcaModeloes
                                       where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                       select c.ncob.cnom).ToList();

                    //Creación de los Datos del correo
                    var subjectSend = "Coordinación de Bienes Informáticos. ";
                    var bodySend = " el mantenimiento del Bien Informático de tipo " + marcaModelo.FirstOrDefault() + ", con serial '" + bieninformatico.BienInformaticoId +
                                    "' que estaba en la localidad " + localidad.FirstOrDefault() + ", en el cargo "
                                    + cargo.FirstOrDefault() + ". <br /><br />";

                    //Busqueda de los correos destinatorios
                    var cc = (from m in db.ControlCorreos
                              where m.CausaMovimientoId == bieninformatico.EstadoId
                              select m.ccor).First();

                    sendEmail(cc, subjectSend, bodySend, true);
                    //--------------------------------  FIN Envio de Correo  ------------------------------//
                    return RedirectToAction("SearchIndex");  
                }
            }

			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.ProveedorId_Visible = ProveedorId_Visible;
            
            ViewBag.ProveedorId = mantenimiento.ProveedorId;
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", mantenimiento.BienInformaticoId);
            return View(mantenimiento);
        }    
       
		//***********************************************************************************//
        // Autor:  								                		     				*//
		//***********************************************************************************//
		// Edit()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista que permite Editar un Mantenimiento especificado. 	*//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del Mantenimiento que se desea editar.					*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para editar el Mantenimiento desado.		*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult Edit(int id)
        {
            Mantenimiento mantenimiento = db.Mantenimientoes.Find(id);
			
			//Metodo GET Inicializar las variables con los valores predeterminados
            ViewBag.ProveedorId = mantenimiento.ProveedorId;
            ViewBag.ProveedorId_Visible = mantenimiento.npro.cnom;
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", mantenimiento.BienInformaticoId);
            return View(mantenimiento);
        }

		//***********************************************************************************//
        // Autor:  							                			     				*//
		//***********************************************************************************//
		// Edit()	Acceso solo ADMINISTRADOR												*//
		// Acción que devuelve la vista para Editar un Mantenimiento. Método POST.			*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	mantenimiento: dato de tipo modelo, que representa un mantenimiento, este es*//
		//		requerido para verificar que los datos suministrados son correctos,  para 	*//
		//		así editar  o enviar un mensaje de error en la aplicación.					*//
		// •	BienInformaticoId: caracteres que contienen el id del bien informático que 	*//
		// 		se editar en el mantenimiento. 												*//
		// •	Parametros con sufijo Visible: String utilizado para el manejo del 			*//
		// 		autocompletado de campos. 													*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve el BI editado.										*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Edit(Mantenimiento mantenimiento, string BienInformaticoId, string ProveedorId_Visible)
        {
            var valid = false;
            var validR = false;
            
			//Verificación de correctitud en los rangos de fecha
            if (mantenimiento.dfim > mantenimiento.dffm)
            {
                validR = true;
                ViewBag.Fail = "Error en los rangos de las fechas.";
            }
            else
            {
                valid = true;
                ViewBag.Fail = "";
            }
            if (valid)
            {
                if (ModelState.IsValid)//Verificar Modelo
                {
                    BienInformatico bieninformatico = db.BienInformaticoes.Find(BienInformaticoId);
                    if (bieninformatico != null)
                    {
                        db.Entry(bieninformatico).State = EntityState.Modified;
                        db.Entry(mantenimiento).State = EntityState.Modified;
                        db.SaveChanges();

                        if (mantenimiento.cflg)
                        {
                            var cargoN = (from m in db.Cargoes
                                          where m.CargoId == bieninformatico.CargoId
                                          select m).ToList().FirstOrDefault();
                            var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ".";
                            var _cobs = " Movimiento realizado por edición del Mantenimiento del Bien Informático";
                            bieninformatico.EstadoId = 2;
                            bieninformatico.CargoId = "DEPOSITO";
                            
                            // Carga Movimiento
                            creacionMovimiento("Entrada", obs + _cobs, bieninformatico.cubf,
                                    bieninformatico.localidad_id, 2,
                                        bieninformatico.BienInformaticoId);

                            
                        }
                        else
                        {
                            var cargoN = (from m in db.Cargoes
                                          where m.CargoId == bieninformatico.CargoId
                                          select m).ToList().FirstOrDefault();
                            var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ".";
                            var _cobs = "Movimiento realizado por edición del Bien Informático";
                            bieninformatico.EstadoId = 6;
                            bieninformatico.CargoId = "DEPOSITO";
                            
                            // Carga Movimiento
                            creacionMovimiento("Salida", obs + _cobs, bieninformatico.cubf,
                                    bieninformatico.localidad_id, 6,
                                        bieninformatico.BienInformaticoId);

                            
                        }

                        return RedirectToAction("SearchIndex");
                    }

                }
            }
            else if (validR)
                ViewBag.Fail = "Error en los rangos de las fechas.";

			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.ProveedorId_Visible = ProveedorId_Visible;

            ViewBag.ProveedorId = mantenimiento.ProveedorId;
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", mantenimiento.BienInformaticoId);
            return View(mantenimiento);
        }
       
		//***********************************************************************************//
        // Autor:  										     				                *//
		//***********************************************************************************//
		// DarAlta()	Acceso solo ADMINISTRADOR											*//
		// Acción que devuelve la vista que permite Dar Alta un Mantenimiento especificado. *//
		// Método GET.																		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	id: identificador del Mantenimiento que se desea Dar de Alta				*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que posee la plantilla para Dar de Alta el Mantenimiento desado.	*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult DarAlta(int id)
        {
            Mantenimiento mantenimiento = db.Mantenimientoes.Find(id);
			
			//Metodo GET Inicializar las variables con los valores predeterminados
            ViewBag.ProveedorId = new SelectList(db.Proveedors, "ProveedorId", "cnom", mantenimiento.ProveedorId);
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", mantenimiento.BienInformaticoId);
            return View(mantenimiento);
        }

		//***********************************************************************************//
        // Autor:  										                     				*//
		//***********************************************************************************//
		// DarAlta()	Acceso solo ADMINISTRADOR											*//
		// Acción que devuelve la vista para Dar de Alta un Mantenimiento. Método POST.		*//
		// _________________________________________________________________________________*//
		// Entrada: 																		*//
		// •	mantenimiento: dato de tipo modelo, que representa un mantenimiento, este es*//
		//		requerido para verificar que los datos suministrados son correctos,  para 	*//
		//		así dar de alta  o enviar un mensaje de error en la aplicación.				*//
		// •	BienInformaticoId: caracteres que contienen el id del bien informático que 	*//
		//		se da de alta de mantenimiento. 											*//
		// _________________________________________________________________________________*//
		// Salida:  Vista que devuelve el BI dado de alta.										*//
		// _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult DarAlta(Mantenimiento mantenimiento, string BienInformaticoId)
        {
            var valid = false;
            var validR = false;
			//Verificación de fecha final requerida
            if (mantenimiento.dffm == null)
            {
                validR = false;
                ViewBag.Fail = "La Fecha Final es Requerida";
            }
            else
            {
				//Verificación de correctitud en los rangos de fecha
                if (mantenimiento.dfim > mantenimiento.dffm)
                {
                    validR = true;
                    ViewBag.Fail = "Error en los rangos de las fechas.";
                }
                else
                {
                    valid = true;
                    ViewBag.Fail = "";
                }
            }

            if (valid)
            {
                if (ModelState.IsValid)//Verificación de modelo
                {
                    BienInformatico bieninformatico = db.BienInformaticoes.Find(BienInformaticoId);
                    if (bieninformatico != null)
                    {
                        db.Entry(bieninformatico).State = EntityState.Modified;
                        db.Entry(mantenimiento).State = EntityState.Modified;
                        db.SaveChanges();

                        if (mantenimiento.cflg)
                        {
                            var cargoN = (from m in db.Cargoes
                                          where m.CargoId == bieninformatico.CargoId
                                          select m).ToList().FirstOrDefault();
                            var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ".";
                            bieninformatico.EstadoId = 2;
                            bieninformatico.CargoId = "DEPOSITO";
                            
                            // Carga Movimiento
                            creacionMovimiento("Entrada", obs, bieninformatico.cubf,
                                    bieninformatico.localidad_id, 2,
                                        bieninformatico.BienInformaticoId);
                            
                        }
                        else
                        {
                            var cargoN = (from m in db.Cargoes
                                          where m.CargoId == bieninformatico.CargoId
                                          select m).ToList().FirstOrDefault();
                            var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + ".";
                            bieninformatico.EstadoId = 5;
                            bieninformatico.CargoId = "DEPOSITO";
                            
                            // Carga Movimiento
                            creacionMovimiento("Salida", obs, bieninformatico.cubf,
                                    bieninformatico.localidad_id, 5,
                                        bieninformatico.BienInformaticoId);

                           
                        }

                        //--------------------------------  Envio de Correo  ------------------------------//
                        //Obtención de la marca modelo
                        var marcaModelo = (from c in db.MarcaModeloes
                                           where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                           select c.ncob.cnom).ToList();

                        //Creación de los Datos del correo
                        var subjectSend = "Coordinación de Bienes Informáticos. ";
                        var bodySend = " la operación de dar de alta por mantenimiento del Bien Informático de tipo " + marcaModelo.FirstOrDefault() +
                                        ", con serial '" + bieninformatico.BienInformaticoId + "'. <br /><br />";

                        //Busqueda de los correos destinatorios
                        var cc = (from m in db.ControlCorreos
                                  where m.CausaMovimientoId == bieninformatico.EstadoId
                                  select m.ccor).First();

                        sendEmail(cc, subjectSend, bodySend, true);
                        //--------------------------------  FIN Envio de Correo  ------------------------------//
                        
                        return RedirectToAction("SearchIndex");
                    }

                }
            }
            else if(validR) 
                ViewBag.Fail = "Error en los rangos de las fechas.";

			//Metodo POST Inicializar las variables con los valores de busqueda introducidos
            ViewBag.ProveedorId = new SelectList(db.Proveedors, "ProveedorId", "cnom", mantenimiento.ProveedorId);
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", mantenimiento.BienInformaticoId);
            return View(mantenimiento);
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // creacionMovimiento()		                        							    *//
        // Función que se encarga de realizar los movimientos       						*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	tipoMov: Tipo de movimiento que se esta realizando. Entrada/Salida          *//
        // •	observacion: Observacion que se desea colocar                               *// 
        // •	ubicacionF: Ubicacion fisica en el que queda el BI                          *//
        // •	localidad: Localidad en la que va a estar el BI                             *//	
        // •	causaMov: Causa movimiento, Revision, Asignacion, Resguardo, Mantenimiento  *//
        // •	serial: Serial del BI que realizó el movimiento                             *//
        // _________________________________________________________________________________*//
        // Salida:  Realiza el movimiento dependiendo de los parametros colocados			*//
        // _________________________________________________________________________________*//
        private void creacionMovimiento(string tipoMov, string observacion,
                            string ubicacionF, string localidad,
                            int causaMov, string serial)
        {

            Movimiento movimiento = new Movimiento
            {
                dmov = DateTime.Now.Date,
                dfmo = DateTime.Now.Date,
                ctmo = tipoMov,
                cobs = observacion,
                cubf = ubicacionF,
                localidad_id = localidad,
                CausaMovimientoId = causaMov,
                BienInformaticoId = serial
            };
            db.Movimientoes.Add(movimiento);

            db.SaveChanges();
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // sendEmail()		Acceso solo ADMINISTRADOR										*//
        // Función que se encarga de enviar los correos del sistema							*//														 			
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	cc: Lista de correso separados por , a los cuales se desea enviar el mensaje*//
        // •	subject: subject que se va a enviar con el correo							*//	
        // •	body: cuerpo que se va a enviar con el correo								*//	
        // •	isBodyHtml: cboleano que dice si el cuerpo del correo es en formatao HTML	*//		
        // _________________________________________________________________________________*//
        // Salida:  Devuelve el envio de correo.											*//
        // _________________________________________________________________________________*//
        public void sendEmail(string cc, string subject, string body, bool isBodyHtml)
        {
            //Creación del objeto para enviar correo electronicos
            var mailMessage = new System.Net.Mail.MailMessage();

            string header = "Buen día, <br /><br />La Coordinación de Bienes Informáticos realizó ";
            //Colocando el destinatario del correo
            mailMessage.To.Add(cc);
            //Estableciendo que el cuerpo del correo es en el formato Html
            mailMessage.IsBodyHtml = isBodyHtml;
            //Título del correo
            mailMessage.Subject = subject;
            //Mensaje del correo
            //Colocando el remitente del correo
            mailMessage.From = new MailAddress("admin_sibi@monaca.com.ve");

            // --------------------- op 1 -------------- //
            string footer = "<br /><br /><div style=\"font-size:14px\" >Este mensaje fue enviado automáticamente por el sistema SIBI. <br /><hr /><br />" +
                          "<table style=\"font-size:14px\" border=\"0\">" +
                            "<tr>" +
                            "<td>Johanna Medina</td>" +
                            "<td>Beatriz Olmedillo</td>" +
                            "</tr>" +
                            "<tr>" +
                            "<td>Administrador de Bienes Informáticos &nbsp; </td>" +
                            "<td>Coordinación de Bienes Informáticos</td>" +
                            "</tr>" +
                            "<tr>" +
                            "<td>+58 (212)2079385</td>" +
                            "<td>+58(212)2079269</td>" +
                            "</tr>" +
                            "<tr>" +
                            "<td>jmmedina@monaca.com.ve</td>" +
                            "<td>bolmedillo@monaca.com.ve</td>" +
                            "</tr>" +
                          "</table><br /></div>" +
                          "<img src=\"@@IMAGE@@\" alt=\"\">";

            //string attachmentPath =  @"\comprometidosconmonaca.png";
            string path = Server.MapPath(@"~\Content\images\comprometidosconmonaca.png");

            //generate the contentID string using the datetime
            string contentID = Path.GetFileName(path).Replace(".", "") + "@zofm";

            //create the INLINE attachment<
            Attachment inline = new Attachment(path);
            inline.ContentDisposition.Inline = true;
            inline.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
            inline.ContentId = contentID;
            inline.ContentType.MediaType = "image/png";
            inline.ContentType.Name = Path.GetFileName(path);
            mailMessage.Attachments.Add(inline);

            // replace the tag with the correct content ID
            footer = footer.Replace("@@IMAGE@@", "cid:" + contentID);
            mailMessage.Body = header + body + footer;

            //Envio del correo.
            SmtpClient mailSender = new SmtpClient(); //use this if you are in the development server
            mailSender.Send(mailMessage);

        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}